/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador;

/**
 *
 * @author Gabriel Queiroz
 */

import java.util.ArrayList;
import java.util.List;
import jcompiler.ControleAutomato;
import jcompiler.Erros;
import tabeladesimbolos.TabelaDeSimbolos;
import token.Token;
import token.TokenAll;
import token.TokenType;
import gui.TelaInicial;
import sintatico.Sintatico;

public class JCompiler implements Runnable {

    private String codigo;
    private TabelaDeSimbolos tabela;
    private List<Token> listaLexico;
    private TelaInicial tela;
    private List<String> erroSintatico;

    public JCompiler(TelaInicial window, String code){
        this.tela = window;
        this.codigo = code;

        listaLexico = new ArrayList<Token>();
        tabela = new TabelaDeSimbolos();
    }

    public void run() {

        ControleAutomato auto = new ControleAutomato();
        Sintatico sint = new Sintatico();
        String[] linhas;

        linhas = codigo.split("\n");

        for(int i = 0; i < linhas.length; i++){
            System.out.println("Processando: " + linhas[i]);
            auto.controle(linhas[i]);
            System.out.println("Comentarios: " + auto.getComent());
        }
        if(auto.getComent()==1){
            auto.getListErro().add(new Erros("FINAL DE COMENTÁRIO NÃO ENCONTRADO!", "*/", -1));
        }

        auto.imprimeLista();
        listaLexico = auto.getListagem();

        sint.iniciaAnalise(listaLexico);
        this.erroSintatico = sint.getErros();

        System.out.println(">>>>listagem: " +auto.getListagem().size());
        for(int i = 0; i < auto.getListagem().size(); i++){
            System.out.println(">>>Entrou no for!!!");
            System.out.println(">>>eToke: " + listaLexico.get(i).geteToke().name());
            if(auto.getListagem().get(i).geteToke().equals(TokenType.NUMERO) == false)
                tela.imprimeTabelaTokens(listaLexico.get(i).geteToke().name(), listaLexico.get(i).getTipo().toString(), listaLexico.get(i).getValor(), listaLexico.get(i).getLinha());
            else
                tela.imprimeTabelaTokens(listaLexico.get(i).geteToke().name(), listaLexico.get(i).getTipo().toString(), String.valueOf( listaLexico.get(i).getValorNumero()), listaLexico.get(i).getLinha());
        }

        if((auto.getListErro().isEmpty()) && (sint.getErros().isEmpty())){
            tela.imprimeSucesso();
        }

        for(int i = 0; i < auto.getListErro().size(); i++){
            tela.imprimeErros("Erro: " + auto.getListErro().get(i).getTipo() + ", valor: " + auto.getListErro().get(i).getValor() + ", na linha: " + auto.getListErro().get(i).getLinha());
        }

        for(int k = 0; k < erroSintatico.size(); k++){
            tela.imprimeErros(erroSintatico.get(k));
        }

        if(!auto.getListErro().isEmpty()){
            tela.imprimeTerminado(auto.getListErro().size());
        }

        //alimenta a tabela de simbolos
        for(int i = 0; i < listaLexico.size(); i++){
            Token token = listaLexico.get(i);

            //adiciona apenas se o token for identificador.
            if(token.getTipo() == TokenAll.IDENTIFICADOR)
                tabela.inserir(token.getValor(), token);
        }//fim do for

    }//fim do método run

}//fim da classe JCompiler
